package com.atguigu.lease.web.admin.service.impl;

import com.atguigu.lease.common.minio.MinioConfiguration;
import com.atguigu.lease.common.minio.MinioProperties;
import com.atguigu.lease.web.admin.service.FileService;
import io.minio.*;
import io.minio.errors.*;
import io.minio.messages.CreateBucketConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileReader;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;


// 文件上传实现类
@Service
public class FileServiceImpl implements FileService {

	@Autowired
	private MinioProperties properties;

	@Autowired
	private MinioClient minioClient;


	@Override
	public String upload(MultipartFile file) {
		// 先获取桶的名字 方便后面创建或者连接对应的桶
		String bucketName = properties.getBucketName();
		// 判断桶是否存在
		try {
			boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
			if (!bucketExists) {
				minioClient.makeBucket(MakeBucketArgs.builder()
					.bucket(bucketName).build());
				// """ 是idea的特性
				// formatted内的参数对应字符串内的 %s
				String policy = """
					       {
					             "Statement" : [ {
					               "Action" : "s3:GetObject",
					               "Effect" : "Allow",
					               "Principal" : "*",
					               "Resource" : "arn:aws:s3:::%s/*"
					             } ],
					             "Version" : "2012-10-17"
					           }
					
					""".formatted(bucketName);
				// 设置桶权限
				minioClient.setBucketPolicy(SetBucketPolicyArgs.builder()
					// 要操作哪个桶
					.bucket(bucketName)
					.config(policy).build());
			} else {
				// 桶已存在
			}

			// 开始上传文件
			// 注释掉的是原先的上传文件方式
			/*minioClient.uploadObject(UploadObjectArgs.builder()
				.filename().build())*/
			// 换一种新的方式进行

			// 设置文件别名 避免重复
			// new SimpleDateFormat("yyyyMMdd").format(new Date())+ "/" 相当于多拼接了一个日期文件夹
			String fileName = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();
			minioClient.putObject(PutObjectArgs.builder()
				.bucket(bucketName)
				// partSize指的是文件分块上传的大小 -1代表不做自定义分区 按minio策略走
				// 上传文件流
				.stream(file.getInputStream(), file.getSize(), -1)
				// 上传的文件名
				.object(fileName)
				// 上传的文件类型 可以不写
				.contentType(file.getContentType())
				.build());
			// 返回minio的url：endpoint + bucketName+filename
			return String.join("/", properties.getEndpoint(),properties.getBucketName(),fileName);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}
}
